﻿using System;
using System.Web.Mvc;
using PagedList;
using SiteCredivale.ViewModels;
using App.Interface;
using AutoMapper;
using Domain.Entidades;

namespace SiteCredivale.Areas.Intranet.Controllers
{
    public class AvisoController : Controller
    {
        //
        // GET: /Intranet/Aviso/

        private readonly IUsuarioAppService _usuarioapp;
        private readonly IAvisoAppService _avisoapp;

        public AvisoController()
        {

        }

        public AvisoController(IUsuarioAppService usuarioapp, IAvisoAppService avisoapp)
        {
            _usuarioapp = usuarioapp;
            _avisoapp = avisoapp;
        }

        [HttpGet]
        public ActionResult GetTipo()
        {


            try
            {
              
              
           
                return Json(_usuarioapp.busca_setor_unidade(Request.QueryString.Get("tipo"),-1), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                ViewBag.err = "Erro ao inserir aviso : " + ex.Message + ",contate o administrador";
                throw ex;
            }
          
        }
       
        [Authorize]
        public ActionResult Lista(int? page, string dt1, string dt2)
        {

            try
            {
                if (_usuarioapp.verifica_permissao(2113) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

                return RedirectToAction("Manutencao","Aviso");


            }
            catch (Exception ex)
            {
                throw ex;
            }
           

        }

        public ActionResult Manutencao(int? page, string dt1, string dt2)
        {

            try
            {


                if (_usuarioapp.verifica_permissao(2113) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(dt1, out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-1);
                }

                if (DateTime.TryParse(dt2, out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();


                
                const int pageSize = 10;
                var pagedavisos = _avisoapp.Listar(data1,data2,null).ToPagedList(page ?? 1, pageSize);
                return View("Manutencao", pagedavisos);


            }
            catch (Exception ex)
            {
                throw ex;
            }
            

        }

        [HttpPost, Authorize]
        public ActionResult Manutencao(FormCollection form)
        {

            try
            {

                DateTime data2;
                DateTime data1;

                if (DateTime.TryParse(form["calendario1"], out data1) == false)
                {
                    data1 = DateTime.Now.AddMonths(-1);
                }

                if (DateTime.TryParse(form["calendario2"], out data2) == false)
                {
                    data2 = DateTime.Now;
                }

                if (data2 < data1)
                {
                    ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                    data1 = DateTime.Now.AddMonths(-1);
                    data2 = DateTime.Now;
                }

                ViewBag.dt1 = data1.ToString();
                ViewBag.dt2 = data2.ToString();

       
            
                const int pageSize = 10;
                var pagedavisos = _avisoapp.Listar(data1, data2, null).ToPagedList(1, pageSize);
                return View(pagedavisos);
            }
            catch (Exception ex)
            {

                throw ex;
            }
          
        }

        [HttpPost,Authorize]
        public ActionResult Deletar(string codigo, string dt1, string dt2, string pagina)
        {
            try
            {

                if (_usuarioapp.verifica_permissao(2101) == false)
                {
                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário,por favor contate o suporte !";
                    return RedirectToAction("Manutencao", "Aviso");
                }



                _avisoapp.deletar(_avisoapp.GetId(int.Parse(codigo)));
                return RedirectToAction("Manutencao", "Aviso", new { page =int.Parse(pagina), dt1 = dt1, dt2 = dt2, });

            }
            catch (Exception ex)
            {
                TempData["msg_err"] = "Erro ao deletar aviso: " + ex.Message + ", contate o administrador";
                return RedirectToAction("Manutencao", "Aviso",new { page =int.Parse(pagina), dt1 = dt1, dt2 = dt2,});
            }

            


        }

        [Authorize]
        public ActionResult Inserir()
        {

            try
            {

           
              
                if (_usuarioapp.verifica_permissao(2100))
                {
                    
                    return View();
                }
                else
                {

                    TempData["msg_retorno"] = "Esta opção não esta habilitado para o seu usuário, por favor contate o suporte !";
                    return RedirectToAction("Home", "Inicio");
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
            
        }

        [HttpPost, Authorize,ValidateInput(false)]
        public ActionResult Inserir(avisoViewModel aviso)
        {

          
            try
            {

                if (string.IsNullOrEmpty(aviso.aviso_descricao))
                {
                    ModelState.AddModelError("aviso_descricao", "*O campo descrição é obrigatório");
                }


                if (aviso.tipo == "sel")
                {
                    ModelState.AddModelError("tipo", "*Selecione uma opção");
                }


                if (aviso.tipos.Length == 0)
                {
                    ModelState.AddModelError("sel", "Selecione pelo menos uma opção na lista");
                }


                if (ModelState.IsValid)
                {
                    ViewBag.res = "Aviso inserido com sucesso !";
                  
                    _avisoapp.Inserir(Mapper.Map<avisoViewModel, aviso>(aviso));
                    aviso = null;
                    ModelState.Clear();
                }

                return View(aviso);
            }
            catch (Exception ex)
            {
                if (ex.Message.Substring(0,5) == "email")
                {

                    aviso = null;
                    ViewBag.res = "Aviso inserido com sucesso,mas não foi possível enviar email para todos os envolvidos,pelo seguinte erro" + "<br /><br />" + ex.Message.Substring(5,ex.Message.Length - 5);
                    ModelState.Clear();
                }
                else
                {
                    ViewBag.err = "Erro ao inserir o aviso : " + ex.Message + ", contate o administrador";

                }
                return  View(aviso);
            }
          


        }

        public ActionResult VerAviso(int? page, string dt1, string dt2,int codigo)
        {

            try
            {
                ViewBag.dt1 = dt1.ToString();
                ViewBag.dt2 = dt2.ToString();
                ViewBag.page = page ?? 1;

               
                return View(_avisoapp.carrega_aviso(codigo));



            }
            catch (Exception ex)
            {
                throw ex;
            }
            

        }


    }

}
